"""
目标：真实图片分类到各个文件夹
1.按照类别创建空文件夹
2.把图片按照类别分到各个文件夹

"""

import os 
import shutil

# 读取类别
dir_names = [ ]
for dir in os.listdir('E:\\brand-form_train'):  # 类别文件夹
    dir_names.append(dir)

# 创建空文件夹
def Gen_empty_directory(threshold):
    base = "E:\\brand-form_pred_{}".format(threshold)  # 分类保存的根文件夹
    if not os.path.exists(base):
        os.mkdir(base)
        for dir in dir_names:
            if not os.path.exists(os.path.join(base,dir)):
                os.mkdir(os.path.join(base,dir))



# 解析txt文件
file_to_dirs = [ ]
with open('D:\\code\\MobileNetV2_By_Myself\\real_data_predictions2.txt','r',encoding='utf-8') as f :  # 分类信息文本：读取txt 把每一行转换成列表
    for line in f :
        file_to_dirs.append(line.replace('\n','').split(','))  # 得到一个列表 [文件目录, 类别, softmax] 元素都是字符串


# 移动图片 ： 因为同一磁盘下 移动文件只是改变目录结构  不涉及文件的复制和删除 
# 这里因为有softmax的阈值 所以还是用拷贝
thresholds = [0.3,0.5] # 阈值
def copy_to_dirs(threshold):
    Gen_empty_directory(threshold)
    file_base = 'D:\\code'  # 图片所在的文件夹
    dir_base = "E:\\brand-form_pred_{}".format(threshold)  #  # 分类保存的根文件夹
    for num,file_to_dir in enumerate(file_to_dirs) :  # 移动文件  最好用枚举 没扫描一万个图片输出一下进度
        if num % 1000 ==0 :
            print('已经处理照片:',num)
        if float(file_to_dir[2]) > threshold:
            file_path = os.path.join(file_base,file_to_dir[0])
            dir_path = os.path.join(dir_base,file_to_dir[1])
            if not os.path.exists(os.path.join(dir_path,os.path.basename(file_path))):  # 判断文件存不存在 方便磁盘负载过大崩溃之后 断点开始
                shutil.copy(file_path,dir_path)

# 多线程
"""
多线程效果仍然速度慢
下次可以把[源文件路径，粘贴路径]传到一个队列里面 然后10个进程到队列里面取地址 做复制
"""
import threading
for threshold in thresholds:
    threading.Thread(target=copy_to_dirs,kwargs={"threshold":threshold}).start()
 
